package sanrenxing.analysis.servlet;

import com.google.gson.Gson;
import com.google.gson.JsonSyntaxException;
import sanrenxing.analysis.dao.AnalysisDao;
import sanrenxing.analysis.dao.impl.AnalysisDaoImpl;
import sanrenxing.analysis.domain.Analysis;
import sanrenxing.analysis.domain.AnalysisTo;

import javax.jnlp.IntegrationService;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 功能:试题难易servlet
 * 编写者:
 * 创建时间：2020/10/13 10:29
 * 版本:
 */
@WebServlet("/AnalysisServlet")
public class AnalysisServlet extends HttpServlet {
    //定义数据层对象
    private AnalysisDao analysisDao=new AnalysisDaoImpl();
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //设置请求字符编号
        req.setCharacterEncoding("utf-8");
        //设置请求内容类型
        resp.setContentType("text/html");
        //设置响应字符集
        resp.setCharacterEncoding("utf-8");

        //接收来自客户端的方法名称
        String method=req.getParameter("method");
        //判断为查找所有
        if (method.equals("findAll")){
            //调用查找所有的方法
            this.findAll(req,resp);
        }else if (method.equals("updateSubjectAnalysis")){//判断请求的方法是否为更新试题难易
            //调用更新试题难易程度方法
            this.updateSubjectAnalysis(req,resp);
        }
    }

    /**
     * 更新试题难易
     * @param req
     * @param resp
     */
    private void updateSubjectAnalysis(HttpServletRequest req, HttpServletResponse resp) throws
            IOException {
        //创建输出流对象
        PrintWriter out=resp.getWriter();
        //接收试题难易所有json数据
        String json=req.getParameter("json");
        //定义Gson操作对象
        Gson gson = new Gson();
        //定义一个空对象AnalysisTo
        AnalysisTo analysisTo= null;
        try {
            //将json数据直接转换成class类
            analysisTo=gson.fromJson(json, AnalysisTo.class);
        }catch (JsonSyntaxException e){
            e.printStackTrace();
        }
        //调用数据层查询试卷结束时间方法，传入分析to中的试卷编号，定义字符串接收
        String finishTime=analysisDao.findPaperFinishTime(analysisTo.getPaperId());
        //将时间分秒分割出来，定义str接收
        String[] str=finishTime.split(":");
        //从分割小时和分钟中拿出来计算计算时间，用考试结束时间变量接收
        int time=(Integer.parseInt(str[0])*60)+(Integer.parseInt(str[1]));
        //创建时间转换对象
        SimpleDateFormat sdf=new SimpleDateFormat("HH:mm:ss");
        //获得当前Date类型时间字符串，定义strs变量接收
        String strs=sdf.format(new Date());
        //通过“:”分割字符串，定义strss接收
        String[] strss=strs.split(":");
        //计算当前拿到的小时和分钟的新时间
        int newTime=(Integer.parseInt(strss[0])*60)+(Integer.parseInt(strss[1]));
        //判断新时间大于考试结束时间，判断考试是否结束，结束后才能更新该行试题数据
        if (newTime>time){
            //判断To试题类中难易程度是否大于0.6
            if (analysisTo.getAccRate()>0.6){
                //修改试题难易程度,难易程度减一，传入试题编号和0
                analysisDao.updateSubHard(analysisTo.getSubjectId(),0);
                //调用删除试题难易数据行的方法，传入试题难易编号
                analysisDao.deleteAnalysis(analysisTo.getAnalyId());
                //判断To试题类中难易程度正确率小于0.4
            }else if (analysisTo.getAccRate()<0.4){
                //修改试题难易程度,难易程度加一，传入试题编号和1
                analysisDao.updateSubHard(analysisTo.getSubjectId(),1);
                //调用删除数据行的方法，传入试题难易编号
                analysisDao.deleteAnalysis(analysisTo.getAnalyId());
            }
        }
    }

    /**
     * 显示所有难易程度表
     * @param req
     * @param resp
     */
    private void findAll(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        //创建输出流对象
        PrintWriter out=resp.getWriter();
        //获取当前页数定义字符串变量pageStr接收
        String pageStr = req.getParameter("page");
        //定义一个保存页数的变量，初始值1
        int page = 1;
        //判断接收到的值是否为空，并通过去两边空格后长度不为0
        if(pageStr!=null && pageStr.trim().length()!=0){
            //通过转换后赋值给定义好的页数变量
            page = Integer.parseInt(pageStr);
        }
        //获取每页行数
        String rowsStr = req.getParameter("limit");
        //定义一个接收行数的变量，赋初始值5
        int rows = 5;
        //判断接收到的值是否为空，并通过去两边空格后长度不为0
        if(rowsStr!=null && rowsStr.trim().length()!=0){
            //转换后赋值给行变量
            rows = Integer.parseInt(rowsStr);
        }
        //创建试题难易实体类
        Analysis analysis= new Analysis();
        //调用数据层方法，查询条件字符串，传参难度对象,定义变量接收
        String condition=analysisDao.getCondition(analysis);
        //调用数据层多条件分页查询，返回值保存到实体难易程度To集合中，传参行页以及条件
        List<AnalysisTo> analysisToList=analysisDao.findByPage(rows,page,condition);
        //多条件查询表中总记录数，传参条件
        int totalRows=analysisDao.count(condition);

        //定义映射集合对象
        Map<String,Object> mapData=new HashMap<String,Object>();
        //在映射集合中添加key为code，值为0的状态码
        mapData.put("code",0);
        //在映射集合中添加key为msg,值为响应信息字符串，赋空字符串
        mapData.put("msg","");
        //在映射集合中添加key为count,值总行数的数据对
        mapData.put("count",totalRows);
        //在映射集合中添加key为data,传入查询到的试题难易集合
        mapData.put("data",analysisToList);
        //建立Gson对象
        Gson gson=new Gson();
        //使用Gson对象把映射集合转换为json格式数据
        String json1=gson.toJson(mapData);
        //将json数据输出到客户端
        out.write(json1);
        //关闭输出流对象
        out.close();
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        this.doGet(req, resp);
    }
}
